package com.itheima.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.itheima.domain.Employee;
import com.itheima.result.R;
import com.itheima.service.EmployeeService;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.DigestUtils;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.time.LocalDateTime;

@RestController
@RequestMapping("/employee")
public class EmployeeController {

    @Autowired
    private EmployeeService employeeService;

    /**
     * 用户登录
     * http://localhost/backend/page/login/login.html
     * @param emp
     * @return
     */
    @PostMapping("/login")
    public R login(HttpServletRequest request, @RequestBody Employee emp) {

        //1.拿到前端传过来的参数
        String username = emp.getUsername();
        String password = emp.getPassword();
        //因为数据库中的用户密码都是加密后才存进去的，所以先给传过来的密码进行加密，然后用数据库中的比较即可
        //2.加密
        password = DigestUtils.md5DigestAsHex(password.getBytes());
        //3.用username去数据库查询有无该用户
        LambdaQueryWrapper<Employee> lqw = new LambdaQueryWrapper<Employee>();
        lqw.eq(Employee::getUsername, username);
        Employee one = employeeService.getOne(lqw);
        //4.1若查询结果为null，则返回前端告知错误
        if (null == one) {
            return R.error("查无此人");
        }
        //4.2 密码比对，若不一致，则返回错误
        if (!password.equals(one.getPassword())) {
            return R.error("密码错误");
        }
        //4.3 查看状态码status，如果是0.则表示账号被禁用，返回错误
        if (0 == one.getStatus()) {
            return R.error("该账户已被封禁");
        }
        //5.把id存进session中，这样当访问其他页面，或进行其他操作时，就能随时获取到当前登录用户的信息
        request.getSession().setAttribute("employee", one.getId());
        //6.返回前端登陆成功
        return R.success(one);
    }

    /**
     * 退出
     */
    @PostMapping("/logout")
    public R logout(HttpSession session) {
        //清除Session即可
        session.invalidate();
        return R.success("退出成功");
    }

    /**
     * 新增员工
     * @param req
     * @param emp
     * @return
     */
    @PostMapping
    public R save(HttpServletRequest req, @RequestBody Employee emp) {
        /**
         * 当我们新增了一条重复的数据时，数据库会给我们报错（username设置了唯一），我们可以用统一异常处理（exception包下）
         *
         * 如果不想让数据库给我们报错，减轻数据库压力，那就我们可以在代码中直接进行判断
         *
         * String username = emp.getUsername();
         *         LambdaQueryWrapper<Employee> lqw = new LambdaQueryWrapper<Employee>();
         *         lqw.eq(Employee::getUsername,username);
         *         Employee one = employeeService.getOne(lqw);
         *         if(one != null){
         *             return R.error("该账号已存在，请重新输入");
         *         }
         */

        //页面上只有部分数据，往数据库存时候，要把内容补齐了再存
        emp.setPassword(DigestUtils.md5DigestAsHex("123456".getBytes()));
        emp.setCreateTime(LocalDateTime.now());
        emp.setUpdateTime(LocalDateTime.now());
        //管理员才能创建员工账号，所以要拿到管理员的账户名：在请求域中设置的那个id（在登录页面设置的）
        Long id = (Long) req.getSession().getAttribute("employee");
        emp.setCreateUser(id);
        emp.setUpdateUser(id);

        //调用service.进行储存
        employeeService.save(emp);
        return R.success("保存成功");
    }

    /**
     * 分页查询
     * @param currentPage
     * @param pageSize
     * @param name
     * @return
     */
    @GetMapping("/page")
    public R PageSelect(@RequestParam("page")Integer currentPage,@RequestParam("pageSize") Integer pageSize,String name) {
        /**
         * 由前端页面（list.html）可知，返回值类型是R类型，并且要从record和total两个属性中获取值
         * 因此我们要把查询的结果放在这两个属性中，在mybatisplus提供的Page类中，正好就是这两个属性
         */
        IPage pageInfo = new Page();
        pageInfo.setCurrent(currentPage);
        pageInfo.setSize(pageSize);

        LambdaQueryWrapper<Employee> lqw = new LambdaQueryWrapper<Employee>();
        lqw.like(StringUtils.isNotBlank(name),Employee::getName,name).orderByDesc(Employee::getUpdateTime);

        employeeService.page(pageInfo, lqw);
        return R.success(pageInfo);
    }

    /**
     * 根据id修改员工状态
     * 禁用，启用，还有点击编辑中的保存，都走这个逻辑
     * @param req
     * @param emp
     * @return
     */
    @PutMapping
    public R update(HttpServletRequest req,@RequestBody Employee emp){
        //记录下修改时间和修改人，所以我们需要拿到之前在请求域中设置的那个id（在登录页面设置的）
        Long id = (Long) req.getSession().getAttribute("employee");
        emp.setUpdateTime(LocalDateTime.now());
        emp.setUpdateUser(id);
        employeeService.updateById(emp);
        return R.success("修改完成");
    }

    /**
     * 通过id查询
     * 点击编辑时，回显员工信息
     * @param id
     */
    @GetMapping("/{id}")
    public R selectById(@PathVariable long id){
        Employee emp = employeeService.getById(id);
        return R.success(emp);
    }
}
